// 给定一个整数数组nums，数组中元素互不相同，要求返回该数组所有可能的不重复子集

// 思路：每个元素都有两种状态，选，没选，向当前子数组中添加可选元素表示选择该元素，在递归结束之后，将之前添加的元素从当前子集数组中移除来表示
// 不选择该元素

function subsets(nums) {
    let res = [] // 存放所有符合条件结果的集合
    let path = []  // 存放当前符合条件的结果
    function backtracking(nums, index) {
        // 将当前符合条件的结果放入集合中
        res.push([...path])
        if (index >= nums.length) {
            // 终止条件
            return
        }
        for (let i = index; i < nums.length; i++) {
            path.push(nums[i]) // 选择元素
            backtracking(nums, i + 1)   // 递归搜索
            path.pop()  // 撤销选择
        }

    }
    backtracking(nums, 0)
    return res
}

let arr = [1, 2, 3]
console.log(subsets(arr));